<?php
/**
 ***********************************************************************************************************************
 * 高危记录
 ***********************************************************************************************************************
 */
namespace soa\access\model\redis;
use artisan\config;

/**
 * Class danger
 * @package soa\access\model\redis
 */
class danger
{
    /**
     * 按IP
     */
    const IP_PREFIX = 'access:danger:ip:';

    /**
     * 按ACCOUNT
     */
    const ACCOUNT_PREFIX = 'access:danger:account:';

    /**
     * 记录高危IP最后一次访问信息 即会覆盖之前的访问信息
     * @param $ip
     * @param array $extra
     * @return bool
     */
    public function addIp($service, $ip, array $extra = [])
    {
        if(empty($service) || !is_string($service) || empty($ip) || !is_string($ip)) {
            return false;
        }
        $key = self::IP_PREFIX . $service;
        $hash_key = $ip;
        $status = $this->getRedis()->hset($key, $hash_key, json_encode($extra));
        // 次日零点过期 仅仅记录一天数据 减少redis内存占用
        $this->getRedis()->expireat($key, strtotime('+1 day', strtotime(date('Y-m-d'))));
        return $status;
    }


    /**
     * 记录高危account最后一次访问信息 即会覆盖之前的访问信息
     * @param $account
     * @param array $extra
     * @return bool
     */
    public function addAccount($service, $account, array $extra = [])
    {
        if(empty($service) || !is_string($service) || empty($account) || !is_string($account)) {
            return false;
        }
        $key = self::ACCOUNT_PREFIX . $service;
        $hash_key = $account;
        $status = $this->getRedis()->hset($key, $hash_key, json_encode($extra));
        // 次日零点过期 仅仅记录一天数据 减少redis内存占用
        $this->getRedis()->expireat($key, strtotime('+1 day', strtotime(date('Y-m-d'))));
        return $status;
    }

    /**
     * 获取一个服务的所有高危账号列表
     * @param $service
     * @return array
     */
    public function getAccounts($service)
    {
        if(empty($service) || !is_string($service)) {
            return [];
        }
        $results = $this->getRedis()->hGetAll(self::ACCOUNT_PREFIX . $service);
        $data = [];
        foreach((array)$results as $key => $result) {
            $data[$key] = json_decode($result, true);
        }
        return $data;
    }

    /**
     * 获取一个服务的所有高危IP列表
     * @param $service
     * @return array
     */
    public function getIps($service)
    {
        if(empty($service) || !is_string($service)) {
            return [];
        }
        $results = $this->getRedis()->hGetAll(self::IP_PREFIX . $service);
        $data = [];
        foreach((array)$results as $key => $result) {
            $data[$key] = json_decode($result, true);
        }
        return $data;
    }

    /**
     * @var \artisan\cache\PHPredisDriver
     */
    private $redis;

    /**
     * @return \artisan\cache\PHPredisDriver
     */
    private function getRedis()
    {
        if(empty($this->redis)) {
            $this->redis = \artisan\cache::connect(config::get('access', 'redis'));
        }
        return $this->redis;
    }

}